Пауль Хоровиц - Искусство схемотехники. Том 3 [Изд.4-е]
Интерфейс последовательного порта 8530 выглядит почти так же. Отличие заключается лишь в том, что адресные входы, выбирающие внутренние регистры, называются по-другому. Сигнал А0 подается на вход А/В' (выбирающий канал А или В сдвоенного порта), а сигнал А1 — на вход D/C' (который выбирает регистры данных или управления). Эта микросхема тоже не обижена регистрами: в ней имеются в каждом канале 16 регистров для записи и 9 регистров для чтения; доступ к ним осуществляется так же, как и в микросхеме 8536, в два этапа.
Тактовая частота 8530 может достигать 6 МГц; мы выбрали частоту 4 МГц, которая позволяет установить скорость передачи до 9600 бод. Асинхронные линии данных TxD и RxD работают с уровнями ТТЛ-логики, а не с биполярными сигналами стыка RS-232 (см. разд. 9.14 и 10.19). Большинство драйверов стыка RS-232 (например, классическая микросхема 1488) требуют двух источников питания, что для нашей системы, которая целиком питается от единственного источника +5В, будет как бельмо на глазу. К счастью, сейчас доступны искусные микросхемы, содержащие емкостные преобразователи напряжения. Эта методика была предложена фирмой Maxim в серии микросхем МАХ232; она используется также в микросхемах LT1080 фирмы LTC. Заметьте, что выход запроса прерывания с открытым стоком объединен по схеме проводного ИЛИ с соответствующим выходом микросхемы календаря-часов, так что возбуждение любого выхода приводит к автовекторизуемому прерыванию уровня IPL1. Обработчик прерывания этого уровня должен определить источник прерывания с помощью процедуры опроса, выполняя программное чтение регистра состояния каждого устройства. Соответствующая программа будет описана ниже.
Календарь-часы. Это последняя из использованных в нашем приборе периферийных БИС, и с ней тоже не все просто. Интерфейс этой микросхемы с магистралью практически такой же, как у микросхем Zilog: пара стробов «типа Intel» (RD', WR') и 4 бит адресации внутренних регистров. Здесь могут возникнуть и те же проблемы с синхронизацией сигнала RD'. Мы говорим «могут», потому что спецификация микросхемы недостаточно однозначна: в ней указывается «типичное» время упреждения от сигналов адреса до RD' (100 нс), но не дается минимального значения. Что имели в виду авторы, мы не знаем, но лучше не рисковать. Поскольку задержанный строб DELRD' у нас уже есть, давайте используем его.
Микросхема ICM7170 представляет собой современную БИС календаря-часов с внутренней схемой переключения питания; вы просто привешиваете к ней трехвольтовую литиевую батарейку, как показано на рис. 11.10. Прежние варианты календаря-часов требовали от вас обеспечения заданного порядка сброса управляющих сигналов при выключении, но микросхема 7170 берет на себя заботу и об этом. Конечно, бесполезно обращаться к микросхеме, если питание +5 В выключено; батарейка лишь поддерживает безостановочный ход часов в периоды спячки, так что схема просыпается с ясной головой и острым чувством времени.
Цепи питания. Закончив разработку схемы прибора, уже не хочется обременять себя такими деталями, как питание и заземление. Не поддавайтесь этому искушению. Наша схема использует «5-вольтовую логику», что на практике часто означает 5 В ± 5 % (в нашем примере ЦП и некоторые периферийные микросхемы требуют напряжения питания от +4,75 В до +5,25 В). Далее, в цепях питания не должно быть больших импульсных выбросов, избавиться от которых можно с помощью щедрого использования керамических конденсаторов 0,1 мкФ с некоторой добавкой танталовых электролитических конденсаторов большей емкости. Крайним случаем «большого выброса» является угрожающее перенапряжение, могущее возникнуть из-за отказа последовательных стабилизаторов напряжения в цепи питания +5 В. На этот случай стоит предусмотреть схему автоматического шунтирования источника питания при перенапряжении — либо на основной плате, либо в самом источнике питания. Выбирая источник питания, учтите, что микропроцессорная плата может легко потреблять 1 А и более, а по печатным проводникам, питающим вставные платы, может протекать и много ампер. Поэтому заранее запланируйте токонесущие печатные проводники достаточно большого сечения, а также сильноточные соединительные разъемы.
Как было показано в разд. 9.11, особую важность представляют заземляющие проводники как на самих печатных платах, так и между ними. Эти проводники должны иметь минимальную индуктивность. Лучше всего отвести под них один слой многослойной печатной платы, хотя «решетчатое» заземление на двухслойной плате часто дает удовлетворительные результаты (подробнее об этом в следующей главе). Наконец, последний совет касается схемы сброса при включении питания. RC-цепочка (с диодом), изображенная на рис. 11.10, заманчиво проста, однако она не будет отзываться на короткие броски напряжения, достаточные для нарушения работы выполняемой программы. Если микропроцессор встроен в прибор, то результатом будут сбои в работе прибора, причем для восстановления его работоспособности вам придется каждый раз выключать и снова включать питание! Мы сталкивались с таким явлением и в промышленном оборудовании, и в собственных разработках. Самое надежное — использовать хорошую современную схему сброса, например серии МАХ690 фирмы Maxim.
Разделавшись с аппаратным конструированием, которое оказалось совсем несложным, перейдем к действительно твердому орешку — программированию.
Разминка: сварим яйцо. Наш усреднитель сигналов потребует весьма сложного комплекса программ, как это обычно и бывает в мире задач реального времени. Внимательное чтение последующих разделов вознаградит читателей, собирающихся разрабатывать собственные микропроцессорные системы, так как они смогут детально познакомиться с большинством особенностей программного обеспечения аппаратуры, управляемой микропроцессором.
Перед тем, однако, как нырнуть в море, полное акул, давайте намочим ноги в мелкой луже простого (и несколько легкомысленного) примера программы для нашей микропроцессорной системы общего назначения. Компьютеры, вообще говоря, предназначены для избавления нас от рутинной работы. Пусть наш прибор каждое утро в 8 часов в течение 5 минут варит нам яйцо!
Представим, что твердотельное реле (рис. 11.10) подключено к небольшому кипятильнику, опущенному в чашку с сырым яйцом. Рассмотрим программу 11.2.
Для упрощения программы будем считать, что компьютер запущен и календарь-часы установлены. (В дальнейшем мы рассмотрим, как выполнить эти малоинтересные, но немаловажные действия!) Программа начинается с засылки нулевого байта в порт ЭЛД, чтобы выключить кипятильник; далее календарь-часы устанавливаются в 24-часовой режим при выключенных прерываниях. После этого программа входит в цикл ("WAKE", пробуждение) непрерывного опроса цифры часов в микросхеме календаря-часов, пока не будет прочитана цифра «8»; в этот момент в порт ЭЛД посылается байт, заполненный единицами, в результате чего включается кипятильник и загораются все ЭЛД.
Далее программа входит во второй цикл ("COOK", кипячение) непрерывного опроса цифры минут в микросхеме календаря-часов, пока не будет прочитана цифра «5»; в этот момент в порт ЭЛД посылается нулевой байт, выключающий кипятильник и гасящий ЭЛД. Наконец, программа переходит к третьему циклу ("WAIT", ожидание) опроса, как и в первом цикле, цифры часов, пока она не перестанет быть «8». В этот момент осуществляется безусловный переход в первый цикл ожидания 8 часов (уже завтрашних).
Мы привели эту скороспелую программу только для того, чтобы показать, как просто она может выглядеть. Не перенимайте наш стиль-многое мы сделали грубо, экономя место и не желая вдаваться в пояснения. В более совершенной программе мы могли повысить «интеллектуальный уровень» таймера, например, заставив один из портов АЦП фиксировать момент закипания воды; именно в этот момент следовало начать отсчет времени кипячения яйца, а можно было ради экономики электроэнергии еще и выключить кипятильник! Естественно также предусмотреть ввод, с помощью кнопки NMI, времени пробуждения, длительности кипячения и т. д. Порт ЦАП можно использовать для индикации времени, возможно, в виде «живых цифр», в то время как другой порт ЦАП (подключенный к динамику в подушке) мягко будит вас, тихо рассказывая что-то задушевное под аккомпанемент записанной в память мелодии…, но мы отклонились от темы. Ну что же, пора нырять!
11.06. Программирование: определение задачиСамый верный способ напрасно потерять время и запутаться раньше, чем вы сделаете что-нибудь полезное — это начать программировать, не определив заранее, что именно вам надо. Это особенно справедливо, если вы программируете прикладной контроллер на языке ассемблера, потому что программа на языке ассемблера сама по себе не отличается ясностью построения, которую ей дает структурированный язык высокого уровня; более того, желая оптимизировать действия программы в реальном времени, вы вынуждены прибегать к разного рода хитроумным приемам и относительно туманным алгоритмам. В результате ваша программа — с переходами и ветвлениями, с разделением функций между главной программой и обработчиками прерываний, с программными флагами, модифицируемыми в самых неожиданных местах, с управляющими байтами для периферийных устройств и многим другим - ваша программа быстро превращается в ужасающую мешанину, особенно если на полдороги вы все еще не представляете целиком свою задачу. Как и при покраске дома, приготовления могут занять больше времени, чем сама работа, но в итоге оказываются оправданными.